package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.smart.community.region.entity.Household;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.math.BigDecimal;

/**
 * 住户数据访问接口
 *
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Mapper
public interface HouseholdMapper extends BaseMapper<Household> {

    /**
     * 根据住户编码查询住户
     * @param householdCode 住户编码
     * @return 住户实体
     */
    Household selectByHouseholdCode(@Param("householdCode") String householdCode);

    /**
     * 根据房户编码和单元ID查询房户
     * @param householdCode 房户编码
     * @param unitId 单元ID
     * @return 房户实体
     */
    Household selectByHouseholdCodeAndUnitId(@Param("householdCode") String householdCode, @Param("unitId") Long unitId);

    /**
     * 根据单元ID查询住户列表
     * @param unitId 单元ID
     * @return 住户列表
     */
    List<Household> selectByUnitId(@Param("unitId") Long unitId);

    /**
     * 根据楼栋ID查询住户列表
     * @param buildingId 楼栋ID
     * @return 住户列表
     */
    List<Household> selectByBuildingId(@Param("buildingId") Long buildingId);

    /**
     * 根据社区ID查询住户列表
     * @param communityId 社区ID
     * @return 住户列表
     */
    List<Household> selectByCommunityId(@Param("communityId") Long communityId);

    /**
     * 批量查询住户
     * @param householdIds 住户ID列表
     * @return 住户列表
     */
    List<Household> selectBatchByIds(@Param("householdIds") List<Long> householdIds);

    /**
     * 根据用户权限查询住户列表
     * @param userId 用户ID
     * @return 有权限的住户列表
     */
    List<Household> selectByUserPermission(@Param("userId") Long userId);

    /**
     * 检查住户编码是否存在
     * @param householdCode 住户编码
     * @param excludeHouseholdId 排除的住户ID
     * @return 是否存在
     */
    Boolean existsByHouseholdCode(@Param("householdCode") String householdCode, @Param("excludeHouseholdId") Long excludeHouseholdId);

    /**
     * 批量更新住户状态
     * @param householdIds 住户ID列表
     * @param status 状态
     * @return 更新数量
     */
    Integer batchUpdateStatus(@Param("householdIds") List<Long> householdIds, @Param("status") Integer status);

    /**
     * 批量删除住户
     * @param householdIds 住户ID列表
     * @return 删除数量
     */
    Integer batchDeleteByIds(@Param("householdIds") List<Long> householdIds);

    /**
     * 统计住户数量
     * @param unitId 单元ID（可选）
     * @param buildingId 楼栋ID（可选）
     * @param communityId 社区ID（可选）
     * @return 住户数量
     */
    Long countHouseholds(@Param("unitId") Long unitId, @Param("buildingId") Long buildingId, @Param("communityId") Long communityId);

    /**
     * 根据房间号查询住户
     * @param roomNumber 房间号
     * @param unitId 单元ID
     * @return 住户列表
     */
    List<Household> selectByRoomNumber(@Param("roomNumber") String roomNumber, @Param("unitId") Long unitId);

    /**
     * 根据住户姓名模糊查询
     * @param householdName 住户姓名
     * @return 住户列表
     */
    List<Household> selectByHouseholdNameLike(@Param("householdName") String householdName);

    /**
     * 根据手机号查询住户
     * @param phone 手机号
     * @return 住户列表
     */
    List<Household> selectByPhone(@Param("phone") String phone);

    /**
     * 更新住户统计信息
     * @param householdId 住户ID
     * @return 更新数量
     */
    Integer updateHouseholdStats(@Param("householdId") Long householdId);

    /**
     * 根据社区ID和单元ID分组查询住户
     * @param communityIds 社区ID列表
     * @param unitIds 单元ID列表
     * @param status 状态
     * @return 住户列表
     */
    List<Household> selectGroupedByUnit(@Param("communityIds") List<Long> communityIds, 
                                       @Param("unitIds") List<Long> unitIds, 
                                       @Param("status") Integer status);

    /**
     * 根据社区ID批量查询住户
     * @param communityIds 社区ID列表
     * @param unitIds 单元ID列表
     * @param status 状态
     * @return 住户列表
     */
    List<Household> selectByCommunityIds(@Param("communityIds") List<Long> communityIds, 
                                        @Param("unitIds") List<Long> unitIds, 
                                        @Param("status") Integer status);

    /**
     * 根据社区ID统计住户数量
     * @param communityId 社区ID
     * @return 住户数量
     */
    Long countByCommunityId(@Param("communityId") Long communityId);

    /**
     * 根据社区ID统计已入住住户数量
     * @param communityId 社区ID
     * @return 已入住住户数量
     */
    Long countOccupiedByCommunityId(@Param("communityId") Long communityId);

    /**
     * 批量插入房户
     * @param households 房户列表
     * @return 插入数量
     */
    Integer batchInsert(@Param("households") List<Household> households);

    /**
     * 批量更新住户户型
     * @param householdIds 住户ID列表
     * @param houseTypeId 户型ID
     * @param houseTypeName 户型名称
     * @return 更新数量
     */
    Integer batchUpdateHouseType(@Param("householdIds") List<Long> householdIds, 
                                @Param("houseTypeId") Long houseTypeId, 
                                @Param("houseTypeName") String houseTypeName);

    /**
     * 批量更新住户户型（包含业务字段）
     * @param householdIds 住户ID列表
     * @param houseTypeId 户型ID
     * @param houseTypeName 户型名称
     * @param totalArea 建筑面积
     * @param usableArea 套内面积
     * @param orientation 朝向
     * @param roomType 房间类型
     * @return 更新数量
     */
    Integer batchUpdateHouseTypeWithFields(@Param("householdIds") List<Long> householdIds, 
                                          @Param("houseTypeId") Long houseTypeId, 
                                          @Param("houseTypeName") String houseTypeName,
                                          @Param("totalArea") BigDecimal totalArea,
                                          @Param("usableArea") BigDecimal usableArea,
                                          @Param("orientation") String orientation,
                                          @Param("roomType") Integer roomType);
} 